result[key] = environs[key]
return result
+_bus = None
+_bus_iface = None
+_name_owner_changed_hook = None
+
+def on_name_owner_changed(name, prev_owner, new_owner):
+ if _name_owner_changed_hook:
+ _name_owner_changed_hook(name, prev_owner, new_owner)
+
+def get_bus():
+ global _bus
+ if _bus is None:
+ dbus_loop = DBusGMainLoop()
+ _bus = dbus.SessionBus(mainloop=dbus_loop)
+ return _bus
+
+def get_bus_iface():
+ global _bus_iface
+ if _bus_iface is None:
+ bus = get_bus()
+ bus_proxy = bus.get_object('org.freedesktop.DBus', '/org/freedesktop/DBus')
+ _bus_iface = dbus.Interface(bus_proxy, 'org.freedesktop.DBus')
+ _bus_iface.connect_to_signal('NameOwnerChanged', on_name_owner_changed)
+ return _bus_iface
+
+def wait_for_dbus_name(wait_name):
+ global _name_owner_changed_hook
+
+ bus_iface = get_bus_iface()
+ loop = gobject.MainLoop()
+
+ def on_name_owner_changed(name, prev_owner, new_owner):
+ if not (name == wait_name and new_owner != ''):
+ return
+ loop.quit()
+ return
+ _name_owner_changed_hook = on_name_owner_changed
+
+ def on_timeout():
+ print "\nFailed to start %s: timed out" % (wait_name,)
+ sys.exit(1)
+ gobject.timeout_add_seconds(7, on_timeout)
+
+ loop.run()
+ _name_owner_changed_hook = None
+
def start_dconf_await_service():
DCONF_NAME = 'ca.desrt.dconf'
- dbus_loop = DBusGMainLoop()
- bus = dbus.SessionBus(mainloop=dbus_loop)
+ bus = get_bus()
+ get_bus_iface() # connect to NameOwnerChanged signal
# See if the service is already running or normal D-Bus activation works
need_manual_activate = False
print "\nFailed to start %s: %s" % (dconf_path, e)
sys.exit(1)
- bus_proxy = bus.get_object('org.freedesktop.DBus', '/org/freedesktop/DBus')
- bus_iface = dbus.Interface(bus_proxy, 'org.freedesktop.DBus')
-
- loop = gobject.MainLoop()
-
- def on_name_owner_changed(name, prev_owner, new_owner):
- if not (name == DCONF_NAME and new_owner != ''):
- return
- print "started"
- loop.quit()
- return
- bus_iface.connect_to_signal('NameOwnerChanged', on_name_owner_changed)
-
- def on_timeout():
- print "\nFailed to start %s: timed out" % (dconf_path,)
- sys.exit(1)
- gobject.timeout_add_seconds(7, on_timeout)
-
- loop.run()
+ wait_for_dbus_name (DCONF_NAME)
def start_shell(perf_output=None):
self_dir = os.path.dirname(os.path.abspath(sys.argv[0]))